const validator = require('validator')
const { genResult, genResultV } = require('./tool')
class Rule {
  constructor(rule, msg, ...params) {
    // 相当于给this赋值了这三个参数（也仍然是浅拷贝）
    Object.assign(this, {
      rule,
      msg,
      params,
    })
  }
  // 验证规则
  validate(value) {
    if (this.rule == 'isOptional') return genResult(true)
    if (!validator[this.rule](value + '', ...this.params)) {
      return genResult(false, this.msg || this.message || '参数错误')
    }
    return genResult(true)
  }
}

// 管理一组rule
class Rules {
  constructor(rules) {
    this.rules = rules
  }
  // 验证
  checkRules(value) {
    if (value == null) {
      // 如果字段为空
      // TODO：当有默认值选项时，即可赋值
      if (this.rules.default) {
        /* pass, msg = '', legalValue */
        return genResultV(true, '', this.rules.default)
      } else {
        return genResultV(false, '字段是必填参数')
      }
    }

    // 对于自定义规则进行校验
    for (let rule of this.rules) {
      let result = rule.validate(value)
      if (!result.pass) {
        const filedResult = genResultV(false, result.msg)
        // 一旦一条校验规则不通过，则立即终止这个字段的验证
        return filedResult
      }
    }
    return genResultV(true, '', this._convert(value))
  }
  _convert(value) {
    for (let rule of this.rules) {
      if (rule.name == 'isInt') {
        return parseInt(value)
      }
      if (rule.name == 'isFloat') {
        return parseFloat(value)
      }
      if (rule.name == 'isBoolean') {
        return value ? true : false
      }
    }
    return value
  }
}

module.exports = {
  Rule,
  Rules,
}
